﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;
using System.Drawing;

namespace WinformsControlsTest;

public partial class MultipleControls : Form
{
    public MultipleControls()
    {
        InitializeComponent();
        CreateMyListView();
    }

    private void CreateMyListView()
    {
        // Create a new ListView control.
        ListView listView2 = new ListView
        {
            Bounds = new Rectangle(new Point(0, 0), new Size(400, 200)),

            // Set the view to show details.
            View = View.Details,
            // Allow the user to edit item text.
            LabelEdit = true,
            // Allow the user to rearrange columns.
            AllowColumnReorder = true,
            // Display check boxes.
            CheckBoxes = true,
            // Select the item and subitems when selection is made.
            FullRowSelect = true,
            // Display grid lines.
            GridLines = true,
            // Sort the items in the list in ascending order.
            Sorting = SortOrder.Ascending,

            VirtualMode = true,
            VirtualListSize = 3,
        };

        // Create three items and three sets of subitems for each item.
        ListViewItem item1 = new("item1", 0)
        {
            // Place a check mark next to the item.
            Checked = true
        };
        item1.SubItems.Add("sub1");
        item1.SubItems.Add("sub2");
        item1.SubItems.Add("sub3");
        ListViewItem item2 = new("item2", 1);
        item2.SubItems.Add("sub4");
        item2.SubItems.Add("sub5");
        item2.SubItems.Add("sub6");
        ListViewItem item3 = new("item3", 0)
        {
            // Place a check mark next to the item.
            Checked = true
        };
        item3.SubItems.Add("sub7");
        item3.SubItems.Add("sub8");
        item3.SubItems.Add("sub9");

        // Add the items to the ListView, but because the listview is in Virtual Mode, we have to manage items ourselves
        // and thus, we can't call the following:
        //      listView2.Items.AddRange(new ListViewItem[] { item1, item2, item3 });
        listView2.RetrieveVirtualItem += (s, e) =>
        {
            e.Item = e.ItemIndex switch
            {
                0 => item1,
                1 => item2,
                2 => item3,
                _ => throw new ArgumentOutOfRangeException(),
            };
        };

        // Create columns for the items and subitems.
        // Width of -2 indicates auto-size.
        listView2.Columns.Add("column1", "Item Column", -2, HorizontalAlignment.Left, 0);
        listView2.Columns.Add("Column 2", -2, HorizontalAlignment.Left);
        listView2.Columns.Add("Column 3", -2, HorizontalAlignment.Left);
        listView2.Columns.Add("Column 4", -2, HorizontalAlignment.Center);
        listView2.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

        // Create two ImageList objects.
        ImageList imageListSmall = new();
        ImageList imageListLarge = new();

        // Initialize the ImageList objects with bitmaps.
        imageListSmall.Images.Add(Image.FromFile("Images\\SmallA.bmp"));
        imageListSmall.Images.Add(Image.FromFile("Images\\SmallABlue.bmp"));
        imageListLarge.Images.Add(Image.FromFile("Images\\LargeA.bmp"));
        imageListLarge.Images.Add(Image.FromFile("Images\\LargeABlue.bmp"));

        // Assign the ImageList objects to the ListView.
        listView2.LargeImageList = imageListLarge;
        listView2.SmallImageList = imageListSmall;

        // Add the ListView to the control collection.
        Controls.Add(listView2);
        listView2.Dock = DockStyle.Bottom;
    }

    private void Test3_Load(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i < 100; i++)
        {
            Thread.Sleep(100);
            backgroundWorker1.ReportProgress(i);
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    private void Button1_Click(object sender, System.EventArgs e)
    {
        textBox1.Enabled = !textBox1.Enabled;
    }

    private void MenuStripScaling_Load(object sender, EventArgs e)
    {
        checkedListBox1.Items.Add("Pennsylvania", CheckState.Checked);
    }
}
